home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / compute / 1988_02 / robokey.s < prev    next >
Text File  |  1987-10-07  |  8KB  |  367 lines

  1. bufstart  equ 80h
  2. bufhead   equ 1ah
  3. buftail   equ 1ch
  4.  
  5.           jmp robokey
  6.  
  7. keybuf    dw 200 dup(?)
  8. keyptr    dw ?
  9. hour      db ?
  10. sec       dw ?
  11. keynum    db ?
  12. intflag   db ?
  13. org1c     dd 0
  14.  
  15.  
  16. int1c:    push ds
  17.           pushf
  18.           push cs
  19.           pop ds
  20.           test intflag
  21.           jg fillbuf
  22.           jl finint2
  23.           dec sec
  24.           jnz finint2
  25.           dec hour
  26.           jnz finint2
  27.           mov intflag,1
  28.           push ax
  29.           lea ax,keybuf
  30.           mov keyptr,ax
  31.           pop ax
  32. fillbuf:  push ax,bx,es
  33.           mov ax,40h
  34.           mov es,ax
  35.           mov bx,es:[bufhead]
  36.           cmp bx,es:[buftail]
  37.           jnz finint1
  38.           mov bx,es:[bufstart]
  39.           cli
  40.           mov es:[bufhead],bx
  41.           mov es:[buftail],bx
  42.           sti
  43.           lea bx,keyptr
  44.           mov bx,[bx]
  45.           mov ax,[bx]
  46.           mov bx,es:[buftail]
  47.           mov es:[bx],ax
  48.           add es:[buftail],2
  49.           add keyptr,2
  50.           dec keynum
  51.           jnz finint1
  52.           mov intflag,-1
  53. finint1:  pop es,bx,ax
  54. finint2:  popf
  55.           pop ds
  56.           jmp cs:[org1c]
  57.  
  58. timebuf   db 9,11 dup(?)
  59. alarmstr  db 10,13,'Alarm is set for $'
  60. clockstr  db 10,13,'Current time is '
  61. dhours    dw ?
  62.           db ':'
  63. dmins     dw ?
  64.           db ' '
  65. ampm      db 'A'
  66.           db 'M',10,13,'$'
  67. timestr   db 'Time for alarm: ','$'
  68. kbdstr    db 10,13,10,13,'Enter characters to be sent to keyboard. (0-200)'
  69. lfcr      db 10,13,'$'
  70. dgterr    db 10,13,'*** DIGIT EXPECTED ***',10,13,10,13,'$'
  71. rngerr    db 10,13,'*** TIME OUT OF RANGE ***',10,13,10,13,'$'
  72. bksp      db 8
  73. ec        db 32,8,'$'
  74. cuf       db 27,'[C$'
  75. chr       db ?
  76. crsrsav   db ?
  77. escnum    db ?
  78. ttime     dw ?
  79. thour     db ?
  80. tsec      dw ?
  81.  
  82. robokey:  call sound
  83.           call setalarm
  84.           call setkbd
  85.           call timedif
  86.           jmp setint
  87.  
  88. sound:    mov al,0b6h
  89.           out 43h,al
  90.           mov al,84h
  91.           out 42h,al
  92.           mov al,0
  93.           out 42h,al
  94.           in al,61h
  95.           push ax
  96.           or al,3
  97.           out 61h,al
  98.           mov cx,2710h
  99. s1:       loop s1
  100.           pop ax
  101.           out 61h,al
  102.           ret
  103.  
  104. print:    mov ah,9
  105.           int 21h
  106.           ret
  107.  
  108. ckdgt:    cmp b[di],'0'
  109.           jl cderr
  110.           cmp b[di],'9'
  111.           jg cderr
  112.           clc
  113.           ret
  114. cderr:    lea dx,dgterr
  115.           call print
  116.           stc
  117.           ret
  118.  
  119. asctime:  mov al,ch
  120.           cmp al,12
  121.           jl at1
  122.           mov ampm,'P'
  123.           jz at2
  124.           sub al,12
  125.           jmp at2
  126. at1:      mov ampm,'A'
  127.           jnz at2
  128.           mov al,12
  129. at2:      test al
  130.           jnz at3
  131.           mov al,12
  132. at3:      aam
  133.           add ax,'00'
  134.           xchg ah,al
  135.           mov dhours,ax
  136.           mov al,cl
  137.           aam
  138.           add ax,'00'
  139.           xchg ah,al
  140.           mov dmins,ax
  141.           ret
  142.  
  143. setalarm: mov ah,2ch
  144.           int 21h
  145.           mov ttime,cx
  146.           call asctime
  147.           lea dx,clockstr
  148.           call print
  149.           lea dx,timestr
  150.           call print
  151.           lea dx,timebuf
  152.           mov ah,0ah
  153.           int 21h
  154.           lea di,timebuf+2
  155.           call ckdgt
  156.           mov al,[di]
  157.           jc setalarm
  158.           inc di
  159.           sub al,'0'
  160.           cmp b[di],':'
  161.           jz  sa4
  162.           call ckdgt
  163.           jc setalarm
  164.           mov dl,10
  165.           mul dl
  166.           add al,[di]
  167.           inc di
  168.           sub al,'0'
  169. sa4:      inc di
  170.           mov cl,al
  171.           call ckdgt
  172.           jc setalarm
  173.           mov al,[di]
  174.           inc di
  175.           call ckdgt
  176.           jc setalarm
  177.           sub al,'0'
  178.           mov dl,10
  179.           mul dl
  180.           add al,[di]
  181.           sub al,'0'
  182.           mov ah,cl
  183.           cmp ah,12
  184.           jg sa9
  185.           cmp al,60
  186.           jl sa5
  187. sa9:      lea dx,rngerr
  188.           call print
  189.           jmp setalarm
  190. sa5:      inc di
  191.           cmp b[di],' '
  192.           jz sa5
  193.           mov cx,ttime
  194.           mov dl,b[di]
  195.           or dl,32
  196.           cmp dl,'a'
  197.           jz saam
  198.           cmp dl,'p'
  199.           jz sapm
  200.           cmp ah,ch
  201.           jg sa11
  202.           jl sa12
  203.           cmp al,cl
  204.           jg finsa
  205. sa12:     add ah,12
  206. sa11:     jmp finsa
  207. saam:     cmp ah,12
  208.           jnz finsa
  209.           xor ah,ah
  210.           jmp finsa
  211. sapm:     cmp ah,12
  212.           jz finsa
  213.           add ah,12
  214. finsa:    mov ttime,ax
  215.           mov hour,ah
  216.           cbw
  217.           mov sec,ax
  218.           mov ax,1092
  219.           mul sec
  220.           add ax,115
  221.           mov sec,ax
  222.           ret
  223.  
  224. setkbd:   lea dx,kbdstr
  225.           call print
  226.           mov escnum,0
  227.           mov keynum,0
  228.           mov crsrsav,0
  229.           lea di,keybuf
  230. readkbd:  xor ah,ah
  231.           int 16h
  232.           mov chr,al
  233.           cmp al,8
  234.           jnz sk1
  235.           mov ah,2
  236.           int 16h
  237.           test al,3
  238.           jnz sk1
  239.           test keynum
  240.           jz readkbd
  241.           mov ah,3
  242.           xor bh,bh
  243.           int 10h
  244.           cmp dl,0
  245.           jg sk4
  246.           dec dh
  247.           mov dl,255
  248. sk5:      inc dl
  249.           mov ah,2
  250.           int 10h
  251.           cmp dl,79
  252.           je sk10
  253.           mov ah,8
  254.           int 10h
  255.           cmp al,255
  256.           jnz sk5
  257. sk10:     mov ah,10
  258.           mov al,32
  259.           xor bh,bh
  260.           mov cx,1
  261.           int 10h
  262.           jmp sk6
  263. sk4:      lea dx,bksp
  264.           call print
  265.           mov crsrsav,0
  266. sk6:      sub keynum,2
  267.           sub di,2
  268.           mov al,chr
  269.           jmp escck
  270. sk1:      mov [di],ax
  271.           add di,2
  272. prtkbd:   mov ah,10
  273.           mov al,chr
  274.           cmp al,126
  275.           jg sk11
  276.           cmp al,31
  277.           jg sk12
  278.           cmp al,13
  279.           jnz sk11
  280.           mov al,255
  281.           jmp sk12
  282. sk11:     mov al,46
  283. sk12:     xor bh,bh
  284.           mov cx,1
  285.           int 10h
  286.           mov al,chr
  287.           cmp al,13
  288.           jnz sk8
  289.           lea dx,lfcr
  290.           call print
  291.           jmp escck
  292. sk8:      lea dx,cuf
  293.           call print
  294.           mov ah,3
  295.           xor bh,bh
  296.           int 10h
  297.           cmp dl,crsrsav
  298.           mov crsrsav,dl
  299.           jnz escck
  300.           cmp dl,2
  301.           jl escck
  302.           lea dx,lfcr
  303.           call print
  304. escck:    cmp chr,27
  305.           jnz sk2
  306.           inc escnum
  307.           jmp sk3
  308. sk2:      mov escnum,0
  309. sk3:      inc keynum
  310.           cmp escnum,3
  311.           jz finsk
  312.           cmp keynum,200
  313.           jz finsk
  314.           jmp readkbd
  315. finsk:    mov al,escnum
  316.           sub keynum,al
  317.           mov keyptr,di
  318.           ret
  319.  
  320. timedif:  mov cx,ttime
  321.           call asctime
  322.           lea dx,alarmstr
  323.           call print
  324.           lea dx,dhours
  325.           call print
  326.  
  327.           mov ah,0
  328.           int 1ah
  329.           mov thour,cl
  330.           mov tsec,dx
  331.           mov al,hour
  332.           cmp al,thour
  333.           jg td7
  334.           jl td8
  335.           mov ax,sec
  336.           cmp ax,tsec
  337.           jl td8
  338. td7:      mov ax,tsec
  339.           sub sec,ax
  340.           mov al,thour
  341.           sbb hour,al
  342.           jmp fintd
  343. td8:      mov ax,sec
  344.           sub ax,tsec
  345.           mov sec,ax
  346.           mov al,hour
  347.           sbb al,thour
  348.           mov hour,al
  349. fintd:    inc sec,hour
  350.           ret
  351.  
  352. setint:   mov intflag,0
  353.           push es
  354.           mov ah,35h
  355.           mov al,1ch
  356.           int 21h
  357.           lea di,org1c
  358.           mov [di],bx
  359.           mov [di+2],es
  360.           pop es
  361.           mov ah,25h
  362.           mov al,1ch
  363.           lea dx,int1c
  364.           int 21h
  365.           lea dx,timebuf
  366.           int 27h
  367.